package vip.fuxk.neav.config;


import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Gateway;
import org.noear.solon.core.util.MultiMap;
import org.noear.solon.net.http.HttpUtils;
import org.smartboot.http.common.enums.HttpMethodEnum;
import org.smartboot.http.common.utils.StringUtils;

/**
 * gateway网关
 * @Mapping("/**") 匹配网关所有请求
 * https://solon.noear.org/article/212
 */
@Mapping("/**")
@Component
public class GatewayConfig extends Gateway {

    @Override
    protected void register() {
        // 添加服务转发
        add(Nav.class);
    }



    public static class Nav {
        //没有加印射值时，将做为默认处理 //当只有默认处理时，将接收所有请求
        @Mapping
        public Object def(Context ctx) throws Throwable {
            //检测请求，并尝试获取接口服务名
            String serverName = ctx.pathMap("/{serverName}/**").get("serverName");
            // 如果没有与之对应的子服务，那么抛出异常
            if (serverName == null) {
                ctx.setHandled(true);
                ctx.status(404);
                return ctx;
            }
            // 仅支持GET和POST请求
            if (!HttpMethodEnum.GET.getMethod().equals(ctx.method()) && !HttpMethodEnum.POST.getMethod().equals(ctx.method())) {
                ctx.setHandled(true);
                ctx.status(405);
                return ctx;
            }
            // 获取服务真实路径 -- 获取url参数，解决转发参数丢失问题
            String params = ctx.queryString();
            String servicePath = ctx.path().substring(serverName.length() + 1);
            if (StringUtils.isNotBlank(params)) {
                servicePath = servicePath + "?" + params;
            }
            MultiMap<String> mpa = ctx.headerMap();
            return HttpUtils.http(serverName, servicePath).headers(mpa).body(ctx.bodyAsBytes(),
                    ctx.contentType()).execAsBody(ctx.method());
        }
    }
}
